package ma;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import org.jaaksi.commondemo.R;
import org.jaaksi.commondemo.util.FileIOUtils;
import org.jaaksi.commondemo.util.FileUtils;

/**
 * Created by fuchaoyang on 2017/11/25.<br/>
 * description：内存分析
 * gc回收机制
 * 4中引用类型
 * StrongReference，gc是无论如何都不会回收它的，即使内存爆掉
 * SoftReference gc内存不足时回收.软引用可用来实现内存敏感的高速缓存,一遍图片缓存用这个
 * WeakReference 只要gc扫描到它就会回收它
 * PhantomReference
 */

public class MAActivity extends FragmentActivity {
  Bitmap btm1;
  String mapping = "好的";

  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ma);
    /*getSupportFragmentManager().beginTransaction()
      .add(android.R.id.content, new EmptyFragment())
      .commit();*/

    // 匿名内部类会持有外部的引用，这里Activity无法释放内存，即使GC扫描到btm1也不会回收它
    /*new Thread(new Runnable() {
      @Override public void run() {
        while (true) {
          System.out.println("xixi");
        }
      }
    }).start();*/

    // 这样就不会持有引用了
    //new LThread().start();

  }

  // 这个也无法正常回收，为什么
  private byte[] bytes;

  public void onClick1(View view) {
    // 由于线程内部持有了Activity的引用，导致Activity中的资源无法得到释放，btm1不能被释放，
    // btm1引用一直在 ，内存gc就不会释放它
    //btm1 = BitmapFactory.decodeResource(getResources(), R.drawable.s1);

    bytes = FileIOUtils.readFile2BytesByStream(
      Environment.getExternalStorageDirectory().getAbsolutePath() + "/keep/weixin.apk");
    int length = bytes.length;
    System.out.println("length = " + length);
  }

  public void onClick2(View view) {
    // 下面这个内存是会被释放的，因为没有引用指向了它，GC扫描到会自动回收
    BitmapFactory.decodeResource(getResources(), R.drawable.s2);
  }

  public static class LThread extends Thread {
    @Override public void run() {
      while (true) {
        System.out.println("xixi");
      }
    }
  }

  @Override protected void onDestroy() {
    super.onDestroy();
    // Bitmap比较特殊，最好手动置为null，如果是大量的图片，则最好调用recycle并主动调用gc
    //btm1 = null;
    bytes = null;

    //if (btm1 != null && !btm1.isRecycled()){
    //  btm1.recycle();
    //}
    //System.gc();
  }
}
